package main

import "fmt"

func main() {
	fmt.Println(plus(1, 2))
	fmt.Println(plusplus(1, 2, 3))

	// 多返回值
	a, b := vals()
	fmt.Println(a)
	fmt.Println(b)

	// 匿名函数
	c, d := func() (int, int) {
		return 3, 7
	}()
	fmt.Println(c, d)

	// 命名返回值
	fmt.Println(split(52))

	//可变参数函数
	fmt.Println(sum(1, 2, 3, 4, 5))
	nums := []int{1, 2, 3, 4, 5}
	fmt.Println(sum(nums...))

	// 初始化函数
	fmt.Println(num) // => 0

	// 作为值的函数
	add := func(a, b int) int {
		return a + b
	}
	fmt.Println(add(3, 4))

	// 内嵌函数
	fmt.Println(scope()())

	// 闭包
	inner, val := outer()
	fmt.Println(val)
	fmt.Println(inner())
	fmt.Println(inner())
	fmt.Println(val)
}

func plus(a int, b int) int {
	return a + b
}
func plusplus(a, b, c int) int {
	return a + b + c
}

func vals() (int, int) {
	return 3, 7
}

func split(sum int) (x, y int) {
	x = sum / 10
	y = sum % 10
	return
}

func sum(nums ...int) int {
	total := 0
	for _, num := range nums {
		total += num
	}
	return total
}

var num = setNumber()

func setNumber() int {
	return 42
}
func init() {
	num = 0
}

func scope() func() int {
	outerVar := 2
	foo := func() int { return outerVar }
	return foo
}

func outer() (func() int, int) {
	outVar := 2
	inner := func() int {
		outVar += 99
		return outVar
	}
	inner()
	return inner, outVar
}
